//
//  array.swift
//  swift_ example
//
//  Created by 魏熙美 on 2020/2/21.
//  Copyright © 2020 魏熙美. All rights reserved.
//

import Foundation

// 3.创建数组 或者 字典 或者 元组 ====================================
// 输出
// ["apple", "橘子", "blue paint", "aaa"]
// ["name": "小明", "age": "24", "address": "未知"]
// 发现，字典会自动排序(自然排序)，根据Key


// 数组和字典 是值拷贝


// 数组 ==========================================================
func 数组() {
    // 创建一个空数组，并指定类型
    // var emptyArray = [String]()
    
    // 创建一个数组, 并初始化赋值
    var shoppingList = ["apple", "water", "blue paint"]
    // 重新赋值
    shoppingList[1] = "橘子"

    // 清空数值
    //shoppingList = []

    print(shoppingList)
    
    // 追加一个元素
    shoppingList.append("番茄")
    // 更具下坐标插入数据
    shoppingList.insert("黄瓜", at: 0)
    shoppingList.insert("梨子", at: shoppingList.endIndex)
    
    
    // 数组转换为字符串，用 逗号分隔
    let shoppingString = shoppingList.joined(separator: ",")
    print("数组转换为字符串，用 逗号分隔: ", shoppingString)
    
    // 删除所有
    shoppingList.removeAll()
    // 根据下坐标删除元素
    shoppingList.remove(at: 1)
    // 删除第一个
    shoppingList.removeLast()
    // 删除最后一个
    shoppingList.removeLast()
    // 根据条件删除， 为true表示删除
    shoppingList.removeAll { (value) -> Bool in
        return value == "apple"
    }
    
    // 总数
    print("数组元素总数：", shoppingList.count)
    // 容量
    print("数组容量", shoppingList.capacity)
    
    
    // 是否为空数组
    let emptyBool = shoppingList.isEmpty
    print("shoppingList是否为空数组：\(emptyBool)")
    
    
    // 遍历组数
    for item in shoppingList {
        print(item)
    }
    
    // 遍历数组，并且可以拿到下坐标和值
    // 也就是把数组变为元组，在遍历
    for (index, value) in shoppingList.enumerated() {
        print(index, value)
    }
 
}

// 字典 =========================================================
// 类似于 其他语言的 Map
func 字典() {
    // 创建一个空字典，并指定类型
    // var emptyDictionary = [String: Float]()
    
    // 创建一个字典，并初始化赋值
    var occupations = [
        "name": "小明",
        "age": "24"
    ]
    print(occupations)
    
    // 清空字典
    // occupations = []
    
    // 添加/修改一个元素, 如果存在则修改这个 key 的值，否则进行添加
    occupations["address"] = "未知"
    // 修改值(返回值是一个被替换的值)
    occupations.updateValue("张三", forKey: "name")
    // 删除所有
    occupations.removeAll()
    // 根据key删除
    occupations.removeValue(forKey: "name")
    
    
    // 根据下坐标删除(第一个方式)
    let index = occupations.index(forKey: "name")
    // Int? 这个可选变量
    // 通过强制解析可以直接获取值，前提一定是个有效值
    // 强制解析 Int(xxx)! 也就是加个感叹号
    occupations.remove(at: index!)
    
    // 根据下坐标删除元素(第二个方式)
    // 第一个参数是从哪里开始, 第二个参数是第几个元素
    let getOffsetIndex = occupations.index(occupations.startIndex, offsetBy: 1)
    occupations.remove(at: getOffsetIndex)
    
    
    // 总数
    print("字典总数:", occupations.count)
    // 容量
    print("字典容量：", occupations.capacity)
    
    // 获取过滤后的字典
    // 这里的参数和下面的排序是类似
    let getFliterValue  = occupations.filter{ (key, value) -> Bool in
        return key == "name"
    }
    print("获取过滤后的字典：", getFliterValue)
    
    // 排序
    // 原本参数类型: ((key: Key, value: Value), (key: Key, value: Value)) throws -> Bool)
    // 传递这个 func 的时候需要这样 ((key: Key, value: Value), (key: Key, value: Value)) -> Bool {...}， 也就是去掉了 throws 这个关键字
    // 但是编译器，还是会报错，因为 ((key: Key, value: Value), (key: Key, value: Value)) 这两参数问题
    // 需要用别名代替, (args0, args1) -> Bool
    // 相当于 args0 等价于一个 (key: Key, value: Value)， args1 也等价于一个 (key: Key, value: Value)
    let sortedvalue = occupations.sorted(by: { (args0, args1) -> Bool in
        return args0.key > args1.key
    })
    print("字典排序", sortedvalue)
    
    
    // 遍历组数
    for item in occupations {
        // 打印key 和 value
        print(item.key, item.value)
    }
    
    for (key, value) in occupations {
        // 打印key 和 value
        print(key, value)
    }
    
    
}

// 4.元组 ========================================================
func 元组() {
    // 创建一个元组(这是一个复合类型)
    let http404Error = (404, "Not Found")
    // 使用复合类型, 需要指定一个别名
    let (code, message) = http404Error
    print("元组值:", code, message)
    print(http404Error.0)
    print(http404Error.1)

    // 可以在声明的时候指定名别
    //let http404Error = (code: 404, message: "Not Found")
    //print("元组值:", http404Error.code, http404Error.message)
    
}



